//
//  HMOAuthViewModel.swift
//  HMVVeibo23
//
//  Created by apple on 17/1/19.
//  Copyright © 2017年 apple. All rights reserved.
//

import UIKit
/*  
    - 帮助OAuthVc 请求数据
    - 帮助OAuthVc 保存用户模型和提供数据给其他控制器
 */
class HMOAuthViewModel: NSObject {
    // 全局访问点
    static let shared:HMOAuthViewModel = HMOAuthViewModel()
    // 路径
    let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("userAccount.archiver")
    // 个人信息对象(解决频繁访问沙盒的弊端)
    var userAccountModel: HMUserAccountModel?
    
    /// 访问令牌(每次使用都要判断下是否过期-> 使用计算型属性)
    var accessToken: String?{
//        // 第一次登陆(userAccountModel == nil)
//        if userAccountModel == nil {
//            return nil
//        }else {
//            // 不是第一次登陆 已经保存过数据
//            // 但是需要判断是否过期
//            // 代表没有过期
//            if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
//                return userAccountModel?.access_token
//            }else {
//                // 已经过期了
//                return nil
//            }
//        }
        
        if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
            return userAccountModel?.access_token
        }else {
            // 已经过期了
            return nil
        }
    }
    
    /// 判断用户是否登陆
    /*
        - 如果accessToken 有值 就代表登陆 反之没有登录
     */
    var isLogin: Bool {
//        if accessToken != nil {
//            return true
//        }else {
//            return false
//        }
        return accessToken != nil
    }
    
    // 重写init方法
    override init(){
        super.init()
        // 给userAccountModel 赋值
        userAccountModel = getUserAccountModel()
    }
}

// 保存和获取用户信息模型数据
extension HMOAuthViewModel{
    // 保存模型
    func saveUserAcountModel(userAccountModel: HMUserAccountModel){
        // 解决第一次获取数据为nil 的bug
        self.userAccountModel = userAccountModel
        // 保存
        NSKeyedArchiver.archiveRootObject(userAccountModel, toFile: file)
        
    }
    // 获取模型
    func getUserAccountModel() -> HMUserAccountModel?{
        
        // 获取 
        // 为什么使用as? 如果用户首次登陆 没有保存数据 获取出来的就是应该为nil
        let userAccountModel = NSKeyedUnarchiver.unarchiveObject(withFile: file) as?HMUserAccountModel
        return userAccountModel
    }
}

// OAuth界面请求数据
extension HMOAuthViewModel{
    // 请求获取accessToken
    func getUserAccount(code: String, isFinish:@escaping (Bool)->()){
        
        HMNetworkTools.shared.loadUserAccount(code: code, success: {(response)->() in
            // 判断response 是否为nil 而且是否是一个字典
            // if-let 或者guard-let 做类型转换的时候 是用as?
            guard let res = response as? [String: Any] else {
                // 执行闭包
                isFinish(false)
                return
            }
            // 字典转模型
            let userAccountModel = HMUserAccountModel.yy_model(withJSON: res)
            
            // 判断是否为nil
            guard let u = userAccountModel else {
                // 执行闭包
                isFinish(false)
                return
            }
            // 请求个人信息数据
            self.getUserInfo(userAccountModel: u, isFinish: isFinish)
        }, failure: {(error)->() in
            print("失败",error)
            // 执行闭包
            isFinish(false)
        })
        
    }
    
    // 获取用户信息数据
    func getUserInfo(userAccountModel: HMUserAccountModel, isFinish:@escaping (Bool)->()){
        HMNetworkTools.shared.loadUserInfo(userAccountModel: userAccountModel, success: {(response)->() in
            // 判断response 是否为nil  切是否可以转成字典
            guard let res = response as? [String: Any] else{
                // 执行闭包
                isFinish(false)
                return
            }
            // 赋值
            userAccountModel.screen_name = res["screen_name"] as? String
            userAccountModel.avatar_large = res["avatar_large"] as? String
            // 保存用户模型
            self.saveUserAcountModel(userAccountModel: userAccountModel)
            // 最后到底成功了
            isFinish(true)
            
        }, failure: {(error)->() in
            print("错误",error)
            // 执行闭包
            isFinish(false)
        })
    }
}


